﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.OracleClient;
using Microsoft.Practices.EnterpriseLibrary.Data.Oracle;


namespace Sinacor.Infra.Tools
{
    public class DataAccess
    {
        //DbConnection cnn = null;

        private DbConnection CreateConnection()
        {
            OracleDatabase db = new OracleDatabase(ConfigurationSettings.AppSettings["connectionString"].ToString());
            return db.CreateConnection();
        }

        public List<RightType> LoadRightTypes()
        {
            List<RightType> types = new List<RightType>();
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT COD_TIPODIREITO, DESC_TIPODIREITO FROM TFWTIPODIREITO ORDER BY COD_TIPODIREITO";
                conn.Open();
                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        types.Add(new RightType(Convert.ToInt32(dr["COD_TIPODIREITO"]), dr["DESC_TIPODIREITO"].ToString()));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return types;
        }

        public List<Right> LoadRights(string pesquisa)
        {
            List<Right> rights = new List<Right>();
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"
							  SELECT  T1.COD_DIREITO AS COD_DIREITO
                                      ,T1.DESC_DIREITO AS DESC_DIREITO
                                      ,T1.COD_TIPODIREITO AS COD_TIPODIREITO
                                      ,T1.COD_TIPO_OPRC AS COD_TIPO_OPRC 
                                      ,T1.COD_FCAO_SINACOR_MAIS  
                                      ,T2.DESC_TIPODIREITO AS DESC_TIPODIREITO                                      
                                      ,T3.TXT_SIGL_FCAO_SINACOR_MAIS AS SIGLA_FCAO
                                      ,T3.DESC_FCAO_SINACOR_MAIS AS DESC_FCAO
                                    FROM 
                                      TFWDIREITO T1 INNER JOIN TFWTIPODIREITO T2
                                      ON T1.COD_TIPODIREITO = T2.COD_TIPODIREITO
                                      LEFT JOIN TGSFCAO_SINACOR_MAIS T3
                                      ON T1.COD_FCAO_SINACOR_MAIS =  T3.COD_FCAO_SINACOR_MAIS";

                if (pesquisa.Length > 0)
                    cmd.CommandText += " WHERE UPPER(T1.DESC_DIREITO) LIKE '%" + pesquisa.ToUpper() + "%'";

                cmd.CommandText += " ORDER BY T1.COD_DIREITO";
                conn.Open();

                Right r = new Right();

                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        rights.Add(new Right(Convert.ToInt32(dr["COD_DIREITO"]),
                                             dr["DESC_DIREITO"].ToString(),
                                             Convert.ToInt32(dr["COD_TIPODIREITO"]),
                                             dr["DESC_TIPODIREITO"].ToString(),
                                             dr["COD_TIPO_OPRC"].ToString(),
                                             new Function((dr["COD_FCAO_SINACOR_MAIS"].ToString().Length > 0 ? Convert.ToInt32(dr["COD_FCAO_SINACOR_MAIS"]) : 0),
                                                          dr["SIGLA_FCAO"].ToString(),
                                                          dr["DESC_FCAO"].ToString())));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return rights;
        }

        public List<Function> LoadFunctions(string pesquisa,
                                            string modulo)
        {
            List<Function> functions = new List<Function>();
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT
                                        FCAO.COD_FCAO_SINACOR_MAIS,  
                                        FCAO.TXT_SIGL_FCAO_SINACOR_MAIS,
                                        FCAO.DESC_FCAO_SINACOR_MAIS
                                    FROM
                                        TGSFCAO_SINACOR_MAIS FCAO INNER JOIN TGSMOD
                                        ON FCAO.COD_MOD = TGSMOD.COD_MOD";
                
                if (modulo.Length > 0)
                    cmd.CommandText += " WHERE UPPER(TGSMOD.TXT_SIGL_MOD) = '" + modulo.ToUpper() + "'";

                if (pesquisa.Length > 0)
                {
                    if (cmd.CommandText.IndexOf("TXT_SIGL_MOD") > 0)
                        cmd.CommandText += " AND";
                    else
                        cmd.CommandText += " WHERE";

                    cmd.CommandText += " UPPER(FCAO.DESC_FCAO_SINACOR_MAIS) LIKE '%" + pesquisa.ToUpper() + "%'";
                }

                cmd.CommandText += " ORDER BY FCAO.TXT_SIGL_FCAO_SINACOR_MAIS";
                conn.Open();

                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        functions.Add(new Function(Convert.ToInt32(dr["COD_FCAO_SINACOR_MAIS"]),
                                                   dr["TXT_SIGL_FCAO_SINACOR_MAIS"].ToString(),
                                                   dr["DESC_FCAO_SINACOR_MAIS"].ToString()));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return functions;
        }

        public int SaveRight(Right direito)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();

                cmd.CommandText = @"INSERT INTO 
									TFWDIREITO (DESC_DIREITO, COD_TIPODIREITO, COD_TIPO_OPRC, TXT_HASH";

                if (direito.Funcao.CodigoFuncao > 0)
                    cmd.CommandText += ", COD_FCAO_SINACOR_MAIS)";
                else
                    cmd.CommandText += ") ";

                cmd.CommandText += @" VALUES ('" + direito.DescricaoDireito + "', "
                                + direito.CodigoTipoDireito + ", '"
                                + direito.CodigoTipoOperacao + "', '"
                                + direito.TextoHash + "'";

                if (direito.Funcao.CodigoFuncao > 0)
                    cmd.CommandText += "," + direito.Funcao.CodigoFuncao + ")";
                else
                    cmd.CommandText += ")";

                conn.Open();
                linhasAfetadas = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }

        public int UpdateRight(Right direito)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"
								UPDATE 
									TFWDIREITO 
								SET 
									DESC_DIREITO = '" + direito.DescricaoDireito + @"'
									,COD_TIPODIREITO = " + direito.CodigoTipoDireito + @"
                                    ,COD_TIPO_OPRC = '" + direito.CodigoTipoOperacao + @"'
                                    ,TXT_HASH = '" + direito.TextoHash + @"'
                                    ,COD_FCAO_SINACOR_MAIS = " + (direito.Funcao.CodigoFuncao.Equals(0) ? "null" : direito.Funcao.CodigoFuncao.ToString()) + @"
								WHERE 
									COD_DIREITO = " + direito.CodigoDireito;
                conn.Open();
                linhasAfetadas = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }

        public int DeleteRights(List<Right> direitos)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                conn.Open();

                foreach (Right direito in direitos)
                {
                    cmd.CommandText = @"
								DELETE FROM 
									TFWDIREITO 
								WHERE 
									COD_DIREITO = " + direito.CodigoDireito.ToString();

                    linhasAfetadas += cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }

        public List<Module> LoadModules()
        {
            List<Module> modules = new List<Module>();
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT CD_SISTEMA FROM TFWMODULOSINST";
                conn.Open();

                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        modules.Add(new Module(dr["CD_SISTEMA"].ToString()));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return modules;
        }

        public List<Module> LoadModules(int cod_direito)
        {
            List<Module> modules = new List<Module>();
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT COD_SIST FROM TFWDIR_MOD_SIST WHERE COD_DIR = " + cod_direito;
                conn.Open();

                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        modules.Add(new Module(dr["COD_SIST"].ToString()));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return modules;
        }

        public int InsertModule(List<Module> modules)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                conn.Open();

                foreach (Module module in modules)
                {
                    cmd.CommandText = @"
								INSERT INTO 
									TFWDIR_MOD_SIST (COD_DIR, COD_TIPO_DIR, COD_SIST, TXT_HASH)
								VALUES 
									(" + module.CodigoDireito + ", " + module.CodigoTipoDireito + ", '" + module.Sigla + "', '" + module.TextoHash + @"')";

                    linhasAfetadas += cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }

        public int DeleteModule(Right direito)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                conn.Open();

                cmd.CommandText = @"DELETE FROM TFWDIR_MOD_SIST WHERE COD_DIR = " + direito.CodigoDireito.ToString();

                linhasAfetadas = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }

        public void DeleteModule(List<Right> direitos)
        {
            foreach (Right direito in direitos)
                DeleteModule(direito);
        }

        public int SelectLastRight()
        {
            int cod_direito = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                conn.Open();

                cmd.CommandText = @"SELECT MAX(COD_DIREITO) FROM TFWDIREITO";

                cod_direito = Convert.ToInt32(cmd.ExecuteScalar());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return cod_direito;
        }
    }
}